HammerDB で RDBMS のベンチマークを取ってみる(MySQL編)
ウィスキー、シガー、パイプをこよなく愛する大栗です。
前回のエントリで HammerDB を使って PostgreSQL のベンチマークを取る手順をまとめました。PostgreSQL 以外にも MySQL やその互換データベースをよく利用することがあるので、今回は MySQL 編ということで HammerDB での手順をまとめたいと思います。
PostgreSQL での手順を確認したい方は、以下のエントリを御覧ください。
HammerDB
HammerDB の詳細は前回の説明を参照ください。
やってみる
前回と同様の注意です。
注意
ベンチマーク結果は、データベース・ソフトウェアや提供環境により実施や公開が制限されている場合があります。例えば Oracle ではベンチマークテストの結果は公開を禁じられています。AWS では AWS Service Terms の 1.8 に準じる必要があります。
事前準備
ベンチマークの環境は以下としています。
- HammerDB : version 4.3
- クライアント環境
- AMI : ami-08a8688fb7eacb171 (amzn2-ami-kernel-5.10-hvm-2.0.20220207.1-x86_64-gp2)
- OS : Amazon Linux 2
- MySQL Ver 8.0.28
- データベース環境
- PostgreSQL 13
また、クライアントからデータベースへのネットワーク接続が問題なく出来ることとします。
MySQL のリポジトリの設定をダウンロードします。
$ wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm
ローカルファイルをインストールします。
$ sudo yum localinstall -y ./mysql80-community-release-el7-5.noarch.rpm
mysql-community-client
をインストールします。
$ sudo yum install -y mysql-community-client
HammerDB をダウンロードします。
$ wget https://github.com/TPC-Council/HammerDB/releases/download/v4.3/HammerDB-4.3-Linux.tar.gz
ダウンロードしたファイルを解凍します。
$ tar xvfz HammerDB-4.3-Linux.tar.gz
解凍したディレクトリへ移動します。
$ cd HammerDB-4.3
HammerDB の CLI を起動します。
$ ./hammerdbcli
librarycheck
コマンドでライブラリのインストール状況をチェックします。出力される結果の中で、MySQL の内容がSuccess
になっていることを確認します。
hammerdb>librarycheck Checking database library for Oracle ・ ・ ・ Checking database library for MySQL Success ... loaded library mysqltcl for MySQL ・ ・ ・
一旦 HammerDB CLI を終了します。
hammerdb>exit
TPROC-C の実施
TPC-C の派生ベンチマークである TPROC-C を実行してみます
MySQL にログインします。
$ mysql -h xxxxxxxxxxxx.example.com -u admin -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 51 ・ ・
ベンチマーク用のデータベースtpcc
を作成します。
mysql> create database tpcc; Query OK, 1 row affected (0.01 sec)
MySQL をログアウトします。
mysql> exit Bye
HammerDB の CLI を起動します。
$ ./hammerdbcli
対象データベースを MySQL に設定し、ベンチマークを TPROC-C に設定します。
hammerdb>dbset db mysql hammerdb>dbset bm TPROC-C
設定内容を確認します。この内容について必要な項目を設定していきます。
hammerdb>print dict Dictionary Settings for MySQL connection { mysql_host = 127.0.0.1 mysql_port = 3306 mysql_socket = /tmp/mysql.sock } tpcc { mysql_count_ware = 1 mysql_num_vu = 1 mysql_user = root mysql_pass = mysql mysql_dbase = tpcc mysql_storage_engine = innodb mysql_partition = false mysql_prepared = false mysql_total_iterations = 10000000 mysql_raiseerror = false mysql_keyandthink = false mysql_driver = test mysql_rampup = 2 mysql_duration = 5 mysql_allwarehouse = false mysql_timeprofile = false mysql_async_scale = false mysql_async_client = 10 mysql_async_verbose = false mysql_async_delay = 1000 mysql_connect_pool = false }
接続先のホスト名と接続ポートを設定します。
hammerdb>diset connection mysql_host xxxxxxxxxxxx.example.com hammerdb>diset connection mysql_port 99999
ベンチマークを実行する際のユーザ名、パスワードを入力します。
hammerdb>diset tpcc mysql_user XXXXX hammerdb>diset tpcc mysql_pass XXXXXXXXXXXXXXXX
先ほど作成したデータベースtpcc
を入力します。
hammerdb>diset tpcc mysql_dbase tpcc
warehouse を指定します。倉庫を表し、データベース全体のサイズを決める因子になっています。
hammerdb>diset tpcc mysql_count_ware 100
データロード時の同時実行数を指定します。
hammerdb>diset tpcc mysql_num_vu 4
設定した内容を確認します。
hammerdb>print dict Dictionary Settings for MySQL connection { mysql_host = xxxxxxxxxxxx.example.com mysql_port = 99999 mysql_socket = /tmp/mysql.sock } tpcc { mysql_count_ware = 100 mysql_num_vu = 4 mysql_user = XXXXX mysql_pass = XXXXXXXXXXXXXXXX mysql_dbase = tpcc mysql_storage_engine = innodb mysql_partition = false mysql_prepared = false mysql_total_iterations = 10000000 mysql_raiseerror = false mysql_keyandthink = false mysql_driver = test mysql_rampup = 2 mysql_duration = 5 mysql_allwarehouse = false mysql_timeprofile = false mysql_async_scale = false mysql_async_client = 10 mysql_async_verbose = false mysql_async_delay = 1000 mysql_connect_pool = false }
ベンチマーク用のスキーマとデータを作成します。
hammerdb>buildschema
データの作成が完了すると、以下のようなメッセージが表示されます。一度改行するとhammerdb>
のプロンプトに戻ります。
Vuser 1:TPCC SCHEMA COMPLETE Vuser 1:FINISHED SUCCESS ALL VIRTUAL USERS COMPLETE
データを作成したときの仮想ユーザを削除します。
hammerdb>vudestroy
次にベンチマークの実施設定を行います。ベンチマークの実施時はドライバスクリプトの設定をtimed
にします。
hammerdb>diset tpcc mysql_driver timed
クライアント側のタイムプロファイルを有効にします。
hammerdb>diset tpcc mysql_timeprofile true
dbset と diset で設定した内容をロードします
hammerdb>loadscript
仮想ユーザの構成を確認します。
hammerdb>print vuconf Virtual Users = 5 User Delay(ms) = 500 Repeat Delay(ms) = 500 Iterations = 1 Show Output = 1 Log Output = 0 Unique Log Name = 0 No Log Buffer = 0 Log Timestamps = 0
設定項目を確認します。
hammerdb>vuset Usage: vuset [vu|delay|repeat|iterations|showoutput|logtotemp|unique|nobuff|timestamps] value
ベンチマークを実行する同時実行ユーザー数を定義します。ここでは 8 にしています。
hammerdb>vuset vu 8
ログを出力する設定を行います。
hammerdb>vuset logtotemp 1
ログ名の設定
hammerdb>vuset unique 1
ログへのタイムスタンプ設定を行います。
hammerdb>vuset timestamps 1
実施した設定を確認します。
hammerdb>print vuconf Virtual Users = 8 User Delay(ms) = 500 Repeat Delay(ms) = 500 Iterations = 1 Show Output = 1 Log Output = 1 Unique Log Name = 1 No Log Buffer = 0 Log Timestamps = 1
ベンチマークの実行ユーザを作成します。出力されるログのパスも表示されます。
hammerdb>vucreate Vuser 1 created MONITOR - WAIT IDLE Vuser 2 created - WAIT IDLE Vuser 3 created - WAIT IDLE Vuser 4 created - WAIT IDLE Vuser 5 created - WAIT IDLE Vuser 6 created - WAIT IDLE Vuser 7 created - WAIT IDLE Vuser 8 created - WAIT IDLE Vuser 9 created - WAIT IDLE Logging activated to /tmp/hammerdb_1234ABCD5678EFGH1234ABCD.log 9 Virtual Users Created with Monitor VU
実行ユーザのステータスを確認します。各ユーザのステータスがWAIT IDLE
になっていることを確認します。
hammerdb>vustatus 1 = WAIT IDLE 2 = WAIT IDLE 3 = WAIT IDLE 4 = WAIT IDLE 5 = WAIT IDLE 6 = WAIT IDLE 7 = WAIT IDLE 8 = WAIT IDLE 9 = WAIT IDLE
ベンチマークを実行します。
hammerdb>vurun Vuser 1:RUNNING Vuser 1:Initializing xtprof time profiler Vuser 1:Beginning rampup time of 2 minutes ・ ・ ・
ALL VIRTUAL USERS COMPLETE
が表示されるとベンチマークの完了です。TEST RESULT
の行に結果が出力されます。また時間情報が出力されたログのパスも出力されています。
結果にはNOPM
とTPM
があります。NOPM は New Orders per Minute の略で、新規発注処理を1分間に何回できたかを表しています。TPC-C の場合は分間の新規発注処理数を tpmC で表しますが、HammerDB では 厳密には TPC-C に準拠していないため使用できません。そのため NOPM という指標を使用しています。TPM は Transactions per Minute の略で、オンライン トランザクション カウンターに表示される値で異なるデータベース間では比較できません。
Vuser 1:Test complete, Taking end Transaction Count. Vuser 1:8 Active Virtual Users configured Vuser 1:TEST RESULT : System achieved 99999 NOPM from 99999 MySQL TPM Vuser 1:Gathering timing data from Active Virtual Users... Vuser 9:FINISHED SUCCESS Vuser 7:FINISHED SUCCESS Vuser 5:FINISHED SUCCESS Vuser 3:FINISHED SUCCESS Vuser 4:FINISHED SUCCESS Vuser 8:FINISHED SUCCESS Vuser 2:FINISHED SUCCESS Vuser 6:FINISHED SUCCESS Vuser 1:Calculating timings... Vuser 1:Writing timing data to /tmp/hdbxtprofile.log Vuser 1:FINISHED SUCCESS ALL VIRTUAL USERS COMPLETE
ログの中身を確認します。各実行ユーザの結果詳細が出力されており、一番最後に各オペレーションの全体結果が出力されます。
$ cat /tmp/hdbxtprofile.log MySQL Hammerdb Time Profile Report @ Sat Feb 12 05:14:55 UTC 2022 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ >>>>> VIRTUAL USER 2 : ELAPSED TIME : 999999ms >>>>> PROC: NEWORD ・ ・ ・ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ >>>>> SUMMARY OF 8 ACTIVE VIRTUAL USERS : MEDIAN ELAPSED TIME : 999999ms >>>>> PROC: NEWORD CALLS: 999999 MIN: 9.999ms AVG: 9.999ms MAX: 999.999ms TOTAL: 9999999.999ms P99: 99.999ms P95: 9.999ms P50: 9.999ms SD: 9999.999 RATIO: 99.999% >>>>> PROC: PAYMENT CALLS: 999999 MIN: 9.999ms AVG: 9.999ms MAX: 999.999ms TOTAL: 9999999.999ms P99: 99.999ms P95: 9.999ms P50: 9.999ms SD: 9999.999 RATIO: 99.999% >>>>> PROC: DELIVERY CALLS: 999999 MIN: 9.999ms AVG: 9.999ms MAX: 999.999ms TOTAL: 9999999.999ms P99: 99.999ms P95: 9.999ms P50: 9.999ms SD: 9999.999 RATIO: 99.999% >>>>> PROC: OSTAT CALLS: 999999 MIN: 9.999ms AVG: 9.999ms MAX: 999.999ms TOTAL: 9999999.999ms P99: 99.999ms P95: 9.999ms P50: 9.999ms SD: 9999.999 RATIO: 99.999% >>>>> PROC: SLEV CALLS: 999999 MIN: 9.999ms AVG: 9.999ms MAX: 999.999ms TOTAL: 9999999.999ms P99: 99.999ms P95: 9.999ms P50: 9.999ms SD: 9999.999 RATIO: 99.999% +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
TPROC-H の実施
TPC-H の派生ベンチマークである TPROC-H を実行してみます
MySQL にログインします。
$ mysql -h xxxxxxxxxxxx.example.com -u admin -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 51 ・ ・
ベンチマーク用のデータベースtpcc
を作成します。
mysql> create database tpch; Query OK, 1 row affected (0.01 sec)
MySQL をログアウトします。
mysql> exit Bye
HammerDB の CLI を起動します。
$ ./hammerdbcli
対象データベースを PostgreSQL に設定し、ベンチマークを TPROC-H に設定します。
hammerdb>dbset db mysql hammerdb>dbset bm TPROC-H
設定内容を確認します。この内容について必要な項目を設定していきます。
hammerdb>print dict Dictionary Settings for MySQL connection { mysql_host = 127.0.0.1 mysql_port = 3306 mysql_socket = /tmp/mysql.sock } tpch { mysql_scale_fact = 1 mysql_tpch_user = root mysql_tpch_pass = mysql mysql_tpch_dbase = tpch mysql_num_tpch_threads = 1 mysql_tpch_storage_engine = innodb mysql_total_querysets = 1 mysql_raise_query_error = false mysql_verbose = false mysql_refresh_on = false mysql_update_sets = 1 mysql_trickle_refresh = 1000 mysql_refresh_verbose = false mysql_cloud_query = false }
接続先のホスト名と接続ポートを設定します。
hammerdb>diset connection mysql_host xxxxxxxxxxxx.example.com hammerdb>diset connection mysql_port 99999
ベンチマークを実行する際のユーザ名、パスワードを入力します。
hammerdb>diset tpch mysql_tpch_user XXXXX hammerdb>diset tpch mysql_tpch_pass XXXXXXXXXXXXXXXX
先ほど作成したデータベースtpch
を入力します。
hammerdb>diset tpch mysql_tpch_dbase tpch
mysql_scale_fact を指定します。データのサイズです。以下の値のいずれかを入力します。
1, 10, 30, 100, 300, 1000, 3000, 10000, 30000, 100000
hammerdb>diset tpch mysql_scale_fact 100
データロード時の同時実行数を指定します。
hammerdb>diset tpch mysql_num_tpch_threads 4
設定した内容を確認します。
hammerdb>print dict Dictionary Settings for MySQL connection { mysql_host = xxxxxxxxxxxx.example.com mysql_port = 99999 mysql_socket = /tmp/mysql.sock } tpch { mysql_scale_fact = 4 mysql_tpch_user = XXXXX mysql_tpch_pass = XXXXXXXXXXXXXXXX mysql_tpch_dbase = tpch mysql_num_tpch_threads = 4 mysql_tpch_storage_engine = innodb mysql_total_querysets = 1 mysql_raise_query_error = false mysql_verbose = false mysql_refresh_on = false mysql_update_sets = 1 mysql_trickle_refresh = 1000 mysql_refresh_verbose = false mysql_cloud_query = false }
ベンチマーク用のスキーマとデータを作成します。
hammerdb>buildschema
データの作成が完了すると、以下のようなメッセージが表示されます。一度改行するとhammerdb>
のプロンプトに戻ります。
Vuser 1:Workers: 0 Active 4 Done Vuser 1:GATHERING SCHEMA STATISTICS Vuser 1:TPCH SCHEMA COMPLETE Vuser 1:FINISHED SUCCESS ALL VIRTUAL USERS COMPLETE TPROC-H Driver Script
データを作成したときの仮想ユーザを削除します。
hammerdb>vudestroy
dbset と diset で設定した内容をロードします
hammerdb>loadscript
仮想ユーザの構成を確認します。
hammerdb>print vuconf Virtual Users = 5 User Delay(ms) = 500 Repeat Delay(ms) = 500 Iterations = 1 Show Output = 1 Log Output = 0 Unique Log Name = 0 No Log Buffer = 0 Log Timestamps = 0
ベンチマークを実行する同時実行ユーザー数を定義します。ここでは 1 にしています。
hammerdb>vuset vu 1
ログを出力する設定を行います。
hammerdb>vuset logtotemp 1
ログ名の設定
hammerdb>vuset unique 1
実施した設定を確認します。
hammerdb>print vuconf Virtual Users = 1 User Delay(ms) = 500 Repeat Delay(ms) = 500 Iterations = 1 Show Output = 1 Log Output = 1 Unique Log Name = 1 No Log Buffer = 0 Log Timestamps = 0
ベンチマークの実行ユーザを作成します。出力されるログのパスも表示されます。
hammerdb>vucreate Vuser 1 created - WAIT IDLE Logging activated to /tmp/hammerdb_ABCD1234EFGH5678IJKM1234.log 1 Virtual Users Created
実行ユーザのステータスを確認します。各ユーザのステータスがWAIT IDLE
になっていることを確認します。
hammerdb>vustatus 1 = WAIT IDLE
ベンチマークを実行します。
hammerdb>vurun Vuser 1:RUNNING Vuser 1:Executing Query 14 (1 of 22) ・ ・ ・ Vuser 1:Completed 1 query set(s) in 99999 seconds Vuser 1:Geometric mean of query times returning rows (22) is 999.99999 Vuser 1:FINISHED SUCCESS ALL VIRTUAL USERS COMPLETE TPROC-H Driver Script
ログの中身を確認します。各クエリの実行時間が出力されています。TPC-H では QphH@Size という 1時間当たりの複合クエリのパフォーマンスを指標にしたものを使用しますが、HammerDB では派生の TPROC-H を使用しているため使用できません。結果を評価するにはクエリの実行時間を個別に比較するなどが良いかもしれません。
$ cat /tmp/hammerdb_ABCD1234EFGH5678IJKM1234.log Hammerdb Log @ Sun Feb 13 13:42:14 UTC 2022 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Vuser 1:Executing Query 14 (1 of 22) Vuser 1:query 14 completed in 0.999 seconds Vuser 1:Executing Query 2 (2 of 22) Vuser 1:query 2 completed in 0.999 seconds Vuser 1:Executing Query 9 (3 of 22) Vuser 1:query 9 completed in 0.999 seconds Vuser 1:Executing Query 20 (4 of 22) Vuser 1:query 20 completed in 0.999 seconds Vuser 1:Executing Query 6 (5 of 22) Vuser 1:query 6 completed in 0.999 seconds Vuser 1:Executing Query 17 (6 of 22) Vuser 1:query 17 completed in 0.999 seconds Vuser 1:Executing Query 18 (7 of 22) Vuser 1:query 18 completed in 0.999 seconds Vuser 1:Executing Query 8 (8 of 22) Vuser 1:query 8 completed in 0.999 seconds Vuser 1:Executing Query 21 (9 of 22) Vuser 1:query 21 completed in 0.999 seconds Vuser 1:Executing Query 13 (10 of 22) Vuser 1:query 13 completed in 0.999 seconds Vuser 1:Executing Query 3 (11 of 22) Vuser 1:query 3 completed in 0.999 seconds Vuser 1:Executing Query 22 (12 of 22) Vuser 1:query 22 completed in 0.999 seconds Vuser 1:Executing Query 16 (13 of 22) Vuser 1:query 16 completed in 0.999 seconds Vuser 1:Executing Query 4 (14 of 22) Vuser 1:query 4 completed in 0.999 seconds Vuser 1:Executing Query 11 (15 of 22) Vuser 1:query 11 completed in 0.999 seconds Vuser 1:Executing Query 15 (16 of 22) Vuser 1:query 15 completed in 0.999 seconds Vuser 1:Executing Query 1 (17 of 22) Vuser 1:query 1 completed in 0.999 seconds Vuser 1:Executing Query 10 (18 of 22) Vuser 1:query 10 completed in 0.999 seconds Vuser 1:Executing Query 19 (19 of 22) Vuser 1:query 19 completed in 0.999 seconds Vuser 1:Executing Query 5 (20 of 22) Vuser 1:query 5 completed in 0.999 seconds Vuser 1:Executing Query 7 (21 of 22) Vuser 1:query 7 completed in 0.999 seconds Vuser 1:Executing Query 12 (22 of 22) Vuser 1:query 12 completed in 0.999 seconds Vuser 1:Completed 1 query set(s) in 99 seconds Vuser 1:Geometric mean of query times returning rows (22) is 0.99999
さいごに
前回に引き続き HammerDB の使い方をまとめたエントリです。今回は MySQL を対象としています。一般的な素の MySQL では TPC-H の様なデータ分析クエリが苦手であるためスケールファクタを大きくしすぎると全然クエリが終わらないと言ったことが起こるかもしれないためデータ量を調整する必要があります。MySQL のインタフェースでデータ分析クエリを多用する必要がある場合は、Aurora MySQL Parallel Query、MariaDB Columnstore、MySQL HeatWave などの使用を検討したほうが良いかと思います。